home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / Interfaces&Libraries / Interfaces / AIncludes / SANEMacs881.a < prev    next >
Encoding:
Text File  |  1993-11-30  |  31.5 KB  |  1,436 lines  |  [TEXT/MPS ]

  1. ;    File:        SANEMacs881.a
  2. ;
  3. ;    Copyright:    © 1983-1993 by Apple Computer, Inc.
  4. ;                All rights reserved.
  5. ;
  6. ;    Version:    System 7.1• for ETO #13
  7. ;    Created:    Tuesday, March 30, 1993 18:00
  8. ;    Modified:    Tue, Nov 30, 1993 01:18:35
  9. ;
  10. ;___________________________________________________________________________
  11.  
  12.                   MC68881
  13.                   MACHINE     MC68020
  14.  
  15.     IF &TYPE('__INCLUDINGSANEMACS__') <> 'UNDEFINED' THEN
  16.         aerror    'Can''t include SANEMacs881.a and SANEMacs.a in same assembly!'
  17.     ELSEIF &TYPE('__INCLUDINGSANEMACS881__') = 'UNDEFINED' THEN
  18. __INCLUDINGSANEMACS881__    SET    1
  19.  
  20. ;———————————————————————————————————————————————————————————
  21. ; Operation code masks.
  22. ;———————————————————————————————————————————————————————————
  23. FOADD             EQU         $0000                     ; add
  24. FOSUB             EQU         $0002                     ; subtract
  25. FOMUL             EQU         $0004                     ; multiply
  26. FODIV             EQU         $0006                     ; divide
  27. FOCMP             EQU         $0008                     ; compare, no exception from unordered
  28. FOCPX             EQU         $000A                     ; compare, signal invalid if unordered
  29. FOREM             EQU         $000C                     ; remainder
  30. FOZ2X             EQU         $000E                     ; convert to extended
  31. FOX2Z             EQU         $0010                     ; convert from extended
  32. FOSQRT            EQU         $0012                     ; square root
  33. FORTI             EQU         $0014                     ; round to integral value
  34. FOTTI             EQU         $0016                     ; truncate to integral value
  35. FOSCALB           EQU         $0018                     ; binary scale
  36. FOLOGB            EQU         $001A                     ; binary log
  37. FOCLASS           EQU         $001C                     ; classify
  38. ; UNDEFINED     EQU  $001E
  39.  
  40. FOSETENV          EQU         $0001                     ; set environment
  41. FOGETENV          EQU         $0003                     ; get environment
  42. FOSETHV           EQU         $0005                     ; set halt vector
  43. FOGETHV           EQU         $0007                     ; get halt vector
  44. FOD2B             EQU         $0009                     ; convert decimal to binary
  45. FOB2D             EQU         $000B                     ; convert binary to decimal
  46. FONEG             EQU         $000D                     ; negate
  47. FOABS             EQU         $000F                     ; absolute
  48. FOCPYSGN          EQU         $0011                     ; copy sign
  49. FONEXT            EQU         $0013                     ; next-after
  50. FOSETXCP          EQU         $0015                     ; set exception
  51. FOPROCENTRY       EQU         $0017                     ; procedure entry
  52. FOPROCEXIT        EQU         $0019                     ; procedure exit
  53. FOTESTXCP         EQU         $001B                     ; test exception
  54. ; UNDEFINED     EQU  $001D
  55. ; UNDEFINED     EQU  $001F
  56.  
  57.  
  58. ;———————————————————————————————————————————————————————————
  59. ; Operand format masks.
  60. ;———————————————————————————————————————————————————————————
  61. FFEXT             EQU         $0000                     ; extended -- 80-bit float
  62. FFDBL             EQU         $0800                     ; double    -- 64-bit float
  63. FFSGL             EQU         $1000                     ; single    -- 32-bit float
  64. FFINT             EQU         $2000                     ; integer    -- 16-bit integer
  65. FFLNG             EQU         $2800                     ; long int -- 32-bit integer
  66. FFCOMP            EQU         $3000                     ; comp     -- 64-bit integer
  67.  
  68. ;———————————————————————————————————————————————————————————
  69. ; Operations: operand addresses should already be on
  70. ; the stack, with the destination address on top.  The
  71. ; suffix X, D, S, C, I, or L  determines the format of the
  72. ; source operand -- extended, double, single, comp,
  73. ; integer, or long integer, respectively; the destination
  74. ; operand is always extended.
  75. ;———————————————————————————————————————————————————————————
  76.  
  77.  
  78. ;———————————————————————————————————————————————————————————
  79. ; Addition.
  80. ;———————————————————————————————————————————————————————————
  81.                   MACRO
  82.                   FADDX
  83.                   fmove.x     ([4,sp]),fp0
  84.                   fadd.x      ([sp]),fp0
  85.                   fmove.x     fp0,([sp])
  86.                   addq        #8,sp
  87.                   ENDM
  88.  
  89.                   MACRO
  90.                   FADDD
  91.                   fmove.d     ([4,sp]),fp0
  92.                   fadd.x      ([sp]),fp0
  93.                   fmove.x     fp0,([sp])
  94.                   addq        #8,sp
  95.                   ENDM
  96.  
  97.                   MACRO
  98.                   FADDS
  99.                   fmove.s     ([4,sp]),fp0
  100.                   fadd.x      ([sp]),fp0
  101.                   fmove.x     fp0,([sp])
  102.                   addq        #8,sp
  103.                   ENDM
  104.  
  105.                   MACRO
  106.                   FADDC
  107.                   fmove.x     ([sp]),fp1
  108.                   jsr         _FC2X
  109.                   fadd        fp1,fp0
  110.                   fmove.x     fp0,([sp])
  111.                   addq        #8,sp
  112.                   ENDM
  113.  
  114.                   MACRO
  115.                   FADDI
  116.                   fmove.w     ([4,sp]),fp0
  117.                   fadd.x      ([sp]),fp0
  118.                   fmove.x     fp0,([sp])
  119.                   addq        #8,sp
  120.                   ENDM
  121.  
  122.                   MACRO
  123.                   FADDL
  124.                   fmove.l     ([4,sp]),fp0
  125.                   fadd.x      ([sp]),fp0
  126.                   fmove.x     fp0,([sp])
  127.                   addq        #8,sp
  128.                   ENDM
  129.  
  130. ;———————————————————————————————————————————————————————————
  131. ; Subtraction.
  132. ;———————————————————————————————————————————————————————————
  133.                   MACRO
  134.                   FSUBX
  135.                   fmove.x     ([sp]),fp0
  136.                   fsub.x      ([4,sp]),fp0
  137.                   fmove.x     fp0,([sp])
  138.                   addq        #8,sp
  139.                   ENDM
  140.  
  141.                   MACRO
  142.                   FSUBD
  143.                   fmove.x     ([sp]),fp0
  144.                   fsub.d      ([4,sp]),fp0
  145.                   fmove.x     fp0,([sp])
  146.                   addq        #8,sp
  147.                   ENDM
  148.  
  149.                   MACRO
  150.                   FSUBS
  151.                   fmove.x     ([sp]),fp0
  152.                   fsub.s      ([4,sp]),fp0
  153.                   fmove.x     fp0,([sp])
  154.                   addq        #8,sp
  155.                   ENDM
  156.  
  157.                   MACRO
  158.                   FSUBC
  159.                   fmove.x     ([sp]),fp1
  160.                   jsr         _FC2X
  161.                   fsub        fp0,fp1
  162.                   fmove       fp1,fp0
  163.                   fmove.x     fp0,([sp])
  164.                   addq        #8,sp
  165.                   ENDM
  166.  
  167.                   MACRO
  168.                   FSUBI
  169.                   fmove.x     ([sp]),fp0
  170.                   fsub.w      ([4,sp]),fp0
  171.                   fmove.x     fp0,([sp])
  172.                   addq        #8,sp
  173.                   ENDM
  174.  
  175.                   MACRO
  176.                   FSUBL
  177.                   fmove.x     ([sp]),fp0
  178.                   fsub.l      ([4,sp]),fp0
  179.                   fmove.x     fp0,([sp])
  180.                   addq        #8,sp
  181.                   ENDM
  182.  
  183. ;———————————————————————————————————————————————————————————
  184. ; Multiplication.
  185. ;———————————————————————————————————————————————————————————
  186.                   MACRO
  187.                   FMULX
  188.                   fmove.x     ([4,sp]),fp0
  189.                   fmul.x      ([sp]),fp0
  190.                   fmove.x     fp0,([sp])
  191.                   addq        #8,sp
  192.                   ENDM
  193.  
  194.                   MACRO
  195.                   FMULD
  196.                   fmove.d     ([4,sp]),fp0
  197.                   fmul.x      ([sp]),fp0
  198.                   fmove.x     fp0,([sp])
  199.                   addq        #8,sp
  200.                   ENDM
  201.  
  202.                   MACRO
  203.                   FMULS
  204.                   fmove.s     ([4,sp]),fp0
  205.                   fmul.x      ([sp]),fp0
  206.                   fmove.x     fp0,([sp])
  207.                   addq        #8,sp
  208.                   ENDM
  209.  
  210.                   MACRO
  211.                   FMULC
  212.                   fmove.x     ([sp]),fp1
  213.                   jsr         _FC2X
  214.                   fmul        fp1,fp0
  215.                   fmove.x     fp0,([sp])
  216.                   addq        #8,sp
  217.                   ENDM
  218.  
  219.                   MACRO
  220.                   FMULI
  221.                   fmove.w     ([4,sp]),fp0
  222.                   fmul.x      ([sp]),fp0
  223.                   fmove.x     fp0,([sp])
  224.                   addq        #8,sp
  225.                   ENDM
  226.  
  227.                   MACRO
  228.                   FMULL
  229.                   fmove.l     ([4,sp]),fp0
  230.                   fmul.x      ([sp]),fp0
  231.                   fmove.x     fp0,([sp])
  232.                   addq        #8,sp
  233.                   ENDM
  234.  
  235. ;———————————————————————————————————————————————————————————
  236. ; Division.
  237. ;———————————————————————————————————————————————————————————
  238.                   MACRO
  239.                   FDIVX
  240.                   fmove.x     ([sp]),fp0
  241.                   fdiv.x      ([4,sp]),fp0
  242.                   fmove.x     fp0,([sp])
  243.                   addq        #8,sp
  244.                   ENDM
  245.  
  246.                   MACRO
  247.                   FDIVD
  248.                   fmove.x     ([sp]),fp0
  249.                   fdiv.d      ([4,sp]),fp0
  250.                   fmove.x     fp0,([sp])
  251.                   addq        #8,sp
  252.                   ENDM
  253.  
  254.                   MACRO
  255.                   FDIVS
  256.                   fmove.x     ([sp]),fp0
  257.                   fdiv.s      ([4,sp]),fp0
  258.                   fmove.x     fp0,([sp])
  259.                   addq        #8,sp
  260.                   ENDM
  261.  
  262.                   MACRO
  263.                   FDIVC
  264.                   fmove.x     ([sp]),fp1
  265.                   jsr         _FC2X
  266.                   fdiv        fp0,fp1
  267.                   fmove       fp1,fp0
  268.                   fmove.x     fp0,([sp])
  269.                   addq        #8,sp
  270.                   ENDM
  271.  
  272.                   MACRO
  273.                   FDIVI
  274.                   fmove.x     ([sp]),fp0
  275.                   fdiv.w      ([4,sp]),fp0
  276.                   fmove.x     fp0,([sp])
  277.                   addq        #8,sp
  278.                   ENDM
  279.  
  280.                   MACRO
  281.                   FDIVL
  282.                   fmove.x     ([sp]),fp0
  283.                   fdiv.l      ([4,sp]),fp0
  284.                   fmove.x     fp0,([sp])
  285.                   addq        #8,sp
  286.                   ENDM
  287.  
  288. ;———————————————————————————————————————————————————————————
  289. ; Square root.
  290. ;———————————————————————————————————————————————————————————
  291.                   MACRO
  292.                   FSQRTX
  293.                   fsqrt.x     ([sp]),fp0
  294.                   fmove.x     fp0,([sp])
  295.                   addq        #4,sp
  296.                   ENDM
  297.  
  298. ;———————————————————————————————————————————————————————————
  299. ; Round to integer, according to the current rounding mode.
  300. ;———————————————————————————————————————————————————————————
  301.                   MACRO
  302.                   FRINTX
  303.                   fint.x      ([sp]),fp0
  304.                   fmove.x     fp0,([sp])
  305.                   addq        #4,sp
  306.                   ENDM
  307.  
  308. ;———————————————————————————————————————————————————————————
  309. ; Truncate to integer, using round toward zero.
  310. ;———————————————————————————————————————————————————————————
  311.                   MACRO
  312.                   FTINTX
  313.                   fintrz.x    ([sp]),fp0
  314.                   fmove.x     fp0,([sp])
  315.                   addq        #4,sp
  316.                   ENDM
  317.  
  318. ;———————————————————————————————————————————————————————————
  319. ; Remainder.        COMPATIBILITY: QUOT is moved to D0
  320. ;———————————————————————————————————————————————————————————
  321.                   MACRO
  322.                   FREMX
  323.                   fmove.x     ([sp]),fp0
  324.                   frem.x      ([4,sp]),fp0
  325.                   fmove.x     fp0,([sp])
  326.                   fmove       fpsr,d0
  327.                   bfextu      d0{8:8},d0
  328.                   bpl.s       @1
  329.                   bclr        #7,d0
  330.                   neg.l       d0
  331. @1                addq        #8,sp
  332.                   ENDM
  333.  
  334.                   MACRO
  335.                   FREMD
  336.                   fmove.x     ([sp]),fp0
  337.                   frem.d      ([4,sp]),fp0
  338.                   fmove.x     fp0,([sp])
  339.                   fmove       fpsr,d0
  340.                   bfextu      d0{8:8},d0
  341.                   bpl.s       @1
  342.                   bclr        #7,d0
  343.                   neg.l       d0
  344. @1                addq        #8,sp
  345.                   ENDM
  346.  
  347.                   MACRO
  348.                   FREMS
  349.                   fmove.x     ([sp]),fp0
  350.                   frem.s      ([4,sp]),fp0
  351.                   fmove.x     fp0,([sp])
  352.                   fmove       fpsr,d0
  353.                   bfextu      d0{8:8},d0
  354.                   bpl.s       @1
  355.                   bclr        #7,d0
  356.                   neg.l       d0
  357. @1                addq        #8,sp
  358.                   ENDM
  359.  
  360.                   MACRO
  361.                   FREMC
  362.                   fmove.x     ([sp]),fp1
  363.                   jsr         _FC2X
  364.                   frem        fp0,fp1
  365.                   fmove       fp1,fp0
  366.                   fmove.x     fp0,([sp])
  367.                   fmove       fpsr,d0
  368.                   bfextu      d0{8:8},d0
  369.                   bpl.s       @1
  370.                   bclr        #7,d0
  371.                   neg.l       d0
  372. @1                addq        #8,sp
  373.                   ENDM
  374.  
  375.                   MACRO
  376.                   FREMI
  377.                   fmove.x     ([sp]),fp0
  378.                   frem.w      ([4,sp]),fp0
  379.                   fmove.x     fp0,([sp])
  380.                   fmove       fpsr,d0
  381.                   bfextu      d0{8:8},d0
  382.                   bpl.s       @1
  383.                   bclr        #7,d0
  384.                   neg.l       d0
  385. @1                addq        #8,sp
  386.                   ENDM
  387.  
  388.                   MACRO
  389.                   FREML
  390.                   fmove.x     ([sp]),fp0
  391.                   frem.l      ([4,sp]),fp0
  392.                   fmove.x     fp0,([sp])
  393.                   fmove       fpsr,d0
  394.                   bfextu      d0{8:8},d0
  395.                   bpl.s       @1
  396.                   bclr        #7,d0
  397.                   neg.l       d0
  398. @1                addq        #8,sp
  399.                   ENDM
  400.  
  401. ;———————————————————————————————————————————————————————————
  402. ; Logb.
  403. ;———————————————————————————————————————————————————————————
  404.                   MACRO
  405.                   FLOGBX
  406.                   fmove.x     ([sp]),fp0
  407.                   fbne.w      @1
  408.                   flog2       fp0
  409.                   bra.s       @3
  410. @1                fmove       fpsr,-(sp)
  411.                   andi.l      #$02000000,(sp)+
  412.                   beq.s       @2
  413.                   fabs        fp0
  414.                   bra.s       @3
  415. @2                fgetexp     fp0,fp0
  416. @3                fmove.x     fp0,([sp])
  417.                   addq        #4,sp
  418.                   ENDM
  419.  
  420. ;———————————————————————————————————————————————————————————
  421. ; Scalb.
  422. ;———————————————————————————————————————————————————————————
  423.                   MACRO
  424.                   FSCALBX
  425.                   jsr         _fprocENTRYsp
  426.                   move.w      ([sp]),([sp],2)
  427.                   addq.l      #2,(sp)
  428.                   MOVE.W      #FFINT+FOSCALB,-(SP)
  429.                   _FP68K
  430.                   fmove.x     fp0,([12,sp])
  431.                   jsr         _fprocEXITsp
  432.                   ENDM
  433.  
  434. ;———————————————————————————————————————————————————————————
  435. ; Copy-sign.
  436. ;———————————————————————————————————————————————————————————
  437.                   MACRO
  438.                   FCPYSGNX
  439.                   bclr        #7,([4,sp])
  440.                   tst.b       ([sp])
  441.                   bpl.s       @1
  442.                   bset        #7,([sp])
  443. @1                addq.l      #8,sp
  444.                   ENDM
  445.  
  446. ;———————————————————————————————————————————————————————————
  447. ; Negate.
  448. ;———————————————————————————————————————————————————————————
  449.                   MACRO
  450.                   FNEGX
  451.                   bchg.b      #7,([sp])
  452.                   addq.l      #4,sp
  453.                   ENDM
  454.  
  455. ;———————————————————————————————————————————————————————————
  456. ; Absolute value.
  457. ;———————————————————————————————————————————————————————————
  458.                   MACRO
  459.                   FABSX
  460.                   bclr.b      #7,([sp])
  461.                   addq.l      #4,sp
  462.                   ENDM
  463.  
  464. ;———————————————————————————————————————————————————————————
  465. ; Next-after.  NOTE: both operands are of the same
  466. ; format, as specified by the usual suffix.
  467. ;———————————————————————————————————————————————————————————
  468.                   MACRO
  469.                   FNEXTS
  470.                   jsr         _fprocENTRYsp
  471.                   MOVE.W      #FFSGL+FONEXT,-(SP)
  472.                   _FP68K
  473.                   jsr         _fprocEXITsp
  474.                   ENDM
  475.  
  476.                   MACRO
  477.                   FNEXTD
  478.                   jsr         _fprocENTRYsp
  479.                   MOVE.W      #FFDBL+FONEXT,-(SP)
  480.                   _FP68K
  481.                   jsr         _fprocEXITsp
  482.                   ENDM
  483.  
  484.                   MACRO
  485.                   FNEXTX
  486.                   jsr         _fprocENTRYsp
  487.                   move.w      ([sp]),([sp],2)
  488.                   addq.l      #2,(sp)
  489.                   move.w      ([4,sp]),([4,sp],2)
  490.                   addq.l      #2,4(sp)
  491.                   MOVE.W      #FFEXT+FONEXT,-(SP)
  492.                   _FP68K
  493.                   fmove.x     fp0,([16,sp])
  494.                   jsr         _fprocEXITsp
  495.                   ENDM
  496.  
  497. ;———————————————————————————————————————————————————————————
  498. ; Conversion to extended.
  499. ;———————————————————————————————————————————————————————————
  500.                   MACRO
  501.                   FX2X
  502.                   fmove.x     ([4,sp]),fp0
  503.                   fmove.x     fp0,([sp])
  504.                   addq.l      #8,sp
  505.                   ENDM
  506.  
  507.                   MACRO
  508.                   FD2X
  509.                   fmove.d     ([4,sp]),fp0
  510.                   fmove.x     fp0,([sp])
  511.                   addq.l      #8,sp
  512.                   ENDM
  513.  
  514.                   MACRO
  515.                   FS2X
  516.                   fmove.s     ([4,sp]),fp0
  517.                   fmove.x     fp0,([sp])
  518.                   addq.l      #8,sp
  519.                   ENDM
  520.  
  521.                   MACRO
  522.                   FI2X
  523.                   fmove.w     ([4,sp]),fp0
  524.                   fmove.x     fp0,([sp])
  525.                   addq.l      #8,sp
  526.                   ENDM
  527.  
  528.                   MACRO
  529.                   FL2X
  530.                   fmove.l     ([4,sp]),fp0
  531.                   fmove.x     fp0,([sp])
  532.                   addq.l      #8,sp
  533.                   ENDM
  534.  
  535.                   MACRO
  536.                   FC2X
  537.                   jsr         _FC2X
  538.                   addq        #8,sp
  539.                   ENDM
  540.  
  541. ;———————————————————————————————————————————————————————————
  542. ; Conversion from extended.
  543. ;———————————————————————————————————————————————————————————
  544.                   MACRO
  545.                   FX2D
  546.                   fmove.x     ([4,sp]),fp0
  547.                   fmove.d     fp0,([sp])
  548.                   addq.l      #8,sp
  549.                   ENDM
  550.  
  551.                   MACRO
  552.                   FX2S
  553.                   fmove.x     ([4,sp]),fp0
  554.                   fmove.s     fp0,([sp])
  555.                   addq.l      #8,sp
  556.                   ENDM
  557.  
  558.                   MACRO
  559.                   FX2I
  560.                   fmove.x     ([4,sp]),fp0
  561.                   fmove.w     fp0,([sp])
  562.                   addq.l      #8,sp
  563.                   ENDM
  564.  
  565.                   MACRO
  566.                   FX2L
  567.                   fmove.x     ([4,sp]),fp0
  568.                   fmove.l     fp0,([sp])
  569.                   addq.l      #8,sp
  570.                   ENDM
  571.  
  572.                   MACRO
  573.                   FX2C
  574.                   jsr         _fprocENTRYsp
  575.                   move.w      ([4,sp]),([4,sp],2)
  576.                   addq.l      #2,4(sp)
  577.                   MOVE.W      #FFCOMP+FOX2Z,-(SP)
  578.                   _FP68K
  579.                   jsr         _fprocEXITsp
  580.                   ENDM
  581.  
  582. ;———————————————————————————————————————————————————————————
  583. ; Binary to decimal conversion.
  584. ;———————————————————————————————————————————————————————————
  585.                   MACRO
  586.                   FX2DEC
  587.                   jsr         _fprocENTRYsp
  588.                   move.l      12(sp),16(sp)
  589.                   move.l      8(sp),12(sp)
  590.                   move.l      28(sp),8(sp)
  591.                   move.w      ([4,sp]),([4,sp],2)
  592.                   addq.l      #2,4(sp)
  593.                   MOVE.W      #FFEXT+FOB2D,-(SP)
  594.                   _FP68K
  595.                   jsr         _fprocEXITsp
  596.                   ENDM
  597.  
  598.                   MACRO
  599.                   FD2DEC
  600.                   jsr         _fprocENTRYsp
  601.                   move.l      12(sp),16(sp)
  602.                   move.l      8(sp),12(sp)
  603.                   move.l      28(sp),8(sp)
  604.                   MOVE.W      #FFDBL+FOB2D,-(SP)
  605.                   _FP68K
  606.                   jsr         _fprocEXITsp
  607.                   ENDM
  608.  
  609.                   MACRO
  610.                   FS2DEC
  611.                   jsr         _fprocENTRYsp
  612.                   move.l      12(sp),16(sp)
  613.                   move.l      8(sp),12(sp)
  614.                   move.l      28(sp),8(sp)
  615.                   MOVE.W      #FFSGL+FOB2D,-(SP)
  616.                   _FP68K
  617.                   jsr         _fprocEXITsp
  618.                   ENDM
  619.  
  620.                   MACRO
  621.                   FC2DEC
  622.                   jsr         _fprocENTRYsp
  623.                   move.l      12(sp),16(sp)
  624.                   move.l      8(sp),12(sp)
  625.                   move.l      28(sp),8(sp)
  626.                   MOVE.W      #FFCOMP+FOB2D,-(SP)
  627.                   _FP68K
  628.                   jsr         _fprocEXITsp
  629.                   ENDM
  630.  
  631.                   MACRO
  632.                   FI2DEC
  633.                   jsr         _fprocENTRYsp
  634.                   move.l      12(sp),16(sp)
  635.                   move.l      8(sp),12(sp)
  636.                   move.l      28(sp),8(sp)
  637.                   MOVE.W      #FFINT+FOB2D,-(SP)
  638.                   _FP68K
  639.                   jsr         _fprocEXITsp
  640.                   ENDM
  641.  
  642.                   MACRO
  643.                   FL2DEC
  644.                   jsr         _fprocENTRYsp
  645.                   move.l      12(sp),16(sp)
  646.                   move.l      8(sp),12(sp)
  647.                   move.l      28(sp),8(sp)
  648.                   MOVE.W      #FFLNG+FOB2D,-(SP)
  649.                   _FP68K
  650.                   jsr         _fprocEXITsp
  651.                   ENDM
  652.  
  653. ;———————————————————————————————————————————————————————————
  654. ; Decimal to binary conversion.
  655. ;———————————————————————————————————————————————————————————
  656.                   MACRO
  657.                   FDEC2X
  658.                   jsr         _fprocENTRYsp
  659.                   addq.l      #2,(sp)
  660.                   MOVE.W      #FFEXT+FOD2B,-(SP)
  661.                   _FP68K
  662.                   move.w      ([12,sp],2),([12,sp])
  663.                   jsr         _fprocEXITsp
  664.                   ENDM
  665.  
  666.                   MACRO
  667.                   FDEC2D
  668.                   jsr         _fprocENTRYsp
  669.                   MOVE.W      #FFDBL+FOD2B,-(SP)
  670.                   _FP68K
  671.                   jsr         _fprocEXITsp
  672.                   ENDM
  673.  
  674.                   MACRO
  675.                   FDEC2S
  676.                   jsr         _fprocENTRYsp
  677.                   MOVE.W      #FFSGL+FOD2B,-(SP)
  678.                   _FP68K
  679.                   jsr         _fprocEXITsp
  680.                   ENDM
  681.  
  682.                   MACRO
  683.                   FDEC2C
  684.                   jsr         _fprocENTRYsp
  685.                   MOVE.W      #FFCOMP+FOD2B,-(SP)
  686.                   _FP68K
  687.                   jsr         _fprocEXITsp
  688.                   ENDM
  689.  
  690.                   MACRO
  691.                   FDEC2I
  692.                   jsr         _fprocENTRYsp
  693.                   MOVE.W      #FFINT+FOD2B,-(SP)
  694.                   _FP68K
  695.                   jsr         _fprocEXITsp
  696.                   ENDM
  697.  
  698.                   MACRO
  699.                   FDEC2L
  700.                   jsr         _fprocENTRYsp
  701.                   MOVE.W      #FFLNG+FOD2B,-(SP)
  702.                   _FP68K
  703.                   jsr         _fprocEXITsp
  704.                   ENDM
  705.  
  706. ;———————————————————————————————————————————————————————————
  707. ; Compare, not signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  708. ;———————————————————————————————————————————————————————————
  709.                   MACRO
  710.                   FCMPX
  711.                   fmove.x     ([sp]),fp0
  712.                   fcmp.x      ([4,sp]),fp0
  713.                   addq.l      #8,sp
  714.                   ENDM
  715.  
  716.                   MACRO
  717.                   FCMPD
  718.                   fmove.x     ([sp]),fp0
  719.                   fcmp.d      ([4,sp]),fp0
  720.                   addq.l      #8,sp
  721.                   ENDM
  722.  
  723.                   MACRO
  724.                   FCMPS
  725.                   fmove.x     ([sp]),fp0
  726.                   fcmp.s      ([4,sp]),fp0
  727.                   addq.l      #8,sp
  728.                   ENDM
  729.  
  730.                   MACRO
  731.                   FCMPC
  732.                   fmovem.x    ([sp]),fp1
  733.                   jsr         _FC2X
  734.                   fcmp.x      fp0,fp1
  735.                   fmovem.x    fp1,([sp])
  736.                   addq.l      #8,sp
  737.                   ENDM
  738.  
  739.                   MACRO
  740.                   FCMPI
  741.                   fmove.x     ([sp]),fp0
  742.                   fcmp.w      ([4,sp]),fp0
  743.                   addq.l      #8,sp
  744.                   ENDM
  745.  
  746.                   MACRO
  747.                   FCMPL
  748.                   fmove.x     ([sp]),fp0
  749.                   fcmp.l      ([4,sp]),fp0
  750.                   addq.l      #8,sp
  751.                   ENDM
  752.  
  753. ;———————————————————————————————————————————————————————————
  754. ; Compare, signaling invalid on unordered.    INCOMPATIBILITY: doesn't set 020's CCR
  755. ;———————————————————————————————————————————————————————————
  756.                   MACRO
  757.                   FCPXX
  758.                   fmove.x     ([sp]),fp0
  759.                   fcmp.x      ([4,sp]),fp0
  760.                   addq.l      #8,sp
  761.                   fbsf.w      *+2
  762.                   ENDM
  763.  
  764.                   MACRO
  765.                   FCPXD
  766.                   fmove.x     ([sp]),fp0
  767.                   fcmp.d      ([4,sp]),fp0
  768.                   addq.l      #8,sp
  769.                   fbsf.w      *+2
  770.                   ENDM
  771.  
  772.                   MACRO
  773.                   FCPXS
  774.                   fmove.x     ([sp]),fp0
  775.                   fcmp.s      ([4,sp]),fp0
  776.                   addq.l      #8,sp
  777.                   fbsf.w      *+2
  778.                   ENDM
  779.  
  780.                   MACRO
  781.                   FCPXC
  782.                   fmove.x     ([sp]),fp1
  783.                   jsr         _FC2X
  784.                   fcmp.x      fp0,fp1
  785.                   fmovem.x    fp1,([sp])
  786.                   addq.l      #8,sp
  787.                   fbsf.w      *+2
  788.                   ENDM
  789.  
  790.                   MACRO
  791.                   FCPXI
  792.                   fmove.x     ([sp]),fp0
  793.                   fcmp.w      ([4,sp]),fp0
  794.                   addq.l      #8,sp
  795.                   fbsf.w      *+2
  796.                   ENDM
  797.  
  798.                   MACRO
  799.                   FCPXL
  800.                   fmove.x     ([sp]),fp0
  801.                   fcmp.l      ([4,sp]),fp0
  802.                   addq.l      #8,sp
  803.                   fbsf.w      *+2
  804.                   ENDM
  805.  
  806. ;———————————————————————————————————————————————————————————
  807. ; The following defines a set of so-called floating
  808. ; branches.  They presume that the appropriate compare
  809. ; operation, FCMPz or FCPXz, precedes.
  810. ;———————————————————————————————————————————————————————————
  811.                   MACRO
  812.                   FBEQL
  813.                   FBEQ.L      &SYSLIST[1]
  814.                   ENDM
  815.  
  816.                   MACRO
  817.                   FBLTL
  818.                   FBOLT.L     &SYSLIST[1]
  819.                   ENDM
  820.  
  821.                   MACRO
  822.                   FBLEL
  823.                   FBOLE.L     &SYSLIST[1]
  824.                   ENDM
  825.  
  826.                   MACRO
  827.                   FBGTL
  828.                   FBOGT.L     &SYSLIST[1]
  829.                   ENDM
  830.  
  831.                   MACRO
  832.                   FBGEL
  833.                   FBOGE.L     &SYSLIST[1]
  834.                   ENDM
  835.  
  836.                   MACRO
  837.                   FBULTL
  838.                   FBULT.L     &SYSLIST[1]
  839.                   ENDM
  840.  
  841.                   MACRO
  842.                   FBULEL
  843.                   FBULE.L     &SYSLIST[1]
  844.                   ENDM
  845.  
  846.                   MACRO
  847.                   FBUGTL
  848.                   FBUGT.L     &SYSLIST[1]
  849.                   ENDM
  850.  
  851.                   MACRO
  852.                   FBUGEL
  853.                   FBUGE.L     &SYSLIST[1]
  854.                   ENDM
  855.  
  856.                   MACRO
  857.                   FBUL
  858.                   FBUN.L      &SYSLIST[1]
  859.                   ENDM
  860.  
  861.                   MACRO
  862.                   FBOL
  863.                   FBOR.L      &SYSLIST[1]
  864.                   ENDM
  865.  
  866.                   MACRO
  867.                   FBNEL
  868.                   FBNE.L      &SYSLIST[1]
  869.                   ENDM
  870.  
  871.                   MACRO
  872.                   FBUEL
  873.                   FBUEQ.L     &SYSLIST[1]
  874.                   ENDM
  875.  
  876.                   MACRO
  877.                   FBLGL
  878.                   FBOGL.L     &SYSLIST[1]
  879.                   ENDM
  880.  
  881. ;———————————————————————————————————————————————————————————
  882. ; Short branch versions.
  883. ;———————————————————————————————————————————————————————————
  884.                   MACRO
  885.                   FBEQS
  886.                   FBEQ.W      &SYSLIST[1]
  887.                   ENDM
  888.  
  889.                   MACRO
  890.                   FBLTS
  891.                   FBOLT.W     &SYSLIST[1]
  892.                   ENDM
  893.  
  894.                   MACRO
  895.                   FBLES
  896.                   FBOLE.W     &SYSLIST[1]
  897.                   ENDM
  898.  
  899.                   MACRO
  900.                   FBGTS
  901.                   FBOGT.W     &SYSLIST[1]
  902.                   ENDM
  903.  
  904.                   MACRO
  905.                   FBGES
  906.                   FBOGE.W     &SYSLIST[1]
  907.                   ENDM
  908.  
  909.                   MACRO
  910.                   FBULTS
  911.                   FBULT.W     &SYSLIST[1]
  912.                   ENDM
  913.  
  914.                   MACRO
  915.                   FBULES
  916.                   FBULE.W     &SYSLIST[1]
  917.                   ENDM
  918.  
  919.                   MACRO
  920.                   FBUGTS
  921.                   FBUGT.W     &SYSLIST[1]
  922.                   ENDM
  923.  
  924.                   MACRO
  925.                   FBUGES
  926.                   FBUGE.W     &SYSLIST[1]
  927.                   ENDM
  928.  
  929.                   MACRO
  930.                   FBUS
  931.                   FBUN.W      &SYSLIST[1]
  932.                   ENDM
  933.  
  934.                   MACRO
  935.                   FBOS
  936.                   FBOR.W      &SYSLIST[1]
  937.                   ENDM
  938.  
  939.                   MACRO
  940.                   FBNES
  941.                   FBNE.W      &SYSLIST[1]
  942.                   ENDM
  943.  
  944.                   MACRO
  945.                   FBUES
  946.                   FBUEQ.W     &SYSLIST[1]
  947.                   ENDM
  948.  
  949.                   MACRO
  950.                   FBLGS
  951.                   FBOGL.W     &SYSLIST[1]
  952.                   ENDM
  953.  
  954. ;———————————————————————————————————————————————————————————
  955. ; Class and sign inquiries.
  956. ;———————————————————————————————————————————————————————————
  957. FCSNAN            EQU         1                         ; signaling NAN
  958. FCQNAN            EQU         2                         ; quiet NAN
  959. FCINF             EQU         3                         ; infinity
  960. FCZERO            EQU         4                         ; zero
  961. FCNORM            EQU         5                         ; normal number
  962. FCDENORM          EQU         6                         ; denormal number
  963.  
  964.                   MACRO
  965.                   FCLASSS
  966.                   MOVE.W      #FFSGL+FOCLASS,-(SP)
  967.                   _FP68K
  968.                   ENDM
  969.  
  970.                   MACRO
  971.                   FCLASSD
  972.                   MOVE.W      #FFDBL+FOCLASS,-(SP)
  973.                   _FP68K
  974.                   ENDM
  975.  
  976.                   MACRO
  977.                   FCLASSX
  978.                   MOVE.W      ([4,SP]),([4,SP],2)
  979.                   ADDQ.L      #2,4(SP)
  980.                   MOVE.W      #FFEXT+FOCLASS,-(SP)
  981.                   _FP68K
  982.                   ENDM
  983.  
  984.                   MACRO
  985.                   FCLASSC
  986.                   MOVE.W      #FFCOMP+FOCLASS,-(SP)
  987.                   _FP68K
  988.                   ENDM
  989.  
  990. ;———————————————————————————————————————————————————————————
  991. ; Bit indexes for bytes of floating point environment word.
  992. ;———————————————————————————————————————————————————————————
  993. FBINVALID         EQU         0                         ; invalid operation
  994. FBUFLOW           EQU         1                         ; underflow
  995. FBOFLOW           EQU         2                         ; overflow
  996. FBDIVZER          EQU         3                         ; division by zero
  997. FBINEXACT         EQU         4                         ; inexact
  998. FBRNDLO           EQU         5                         ; low bit of rounding mode
  999. FBRNDHI           EQU         6                         ; high bit of rounding mode
  1000. FBLSTRND          EQU         7                         ; last round result bit
  1001. FBDBL             EQU         5                         ; double precision control
  1002. FBSGL             EQU         6                         ; single precision control
  1003.  
  1004. ;———————————————————————————————————————————————————————————
  1005. ; Get and set environment.
  1006. ;———————————————————————————————————————————————————————————
  1007.                   MACRO
  1008.                   FGETENV
  1009.                   MOVE.W      #FOGETENV,-(SP)
  1010.                   _FP68K
  1011.                   ENDM
  1012.  
  1013.                   MACRO
  1014.                   FSETENV
  1015.                   MOVE.W      #FOSETENV,-(SP)
  1016.                   _FP68K
  1017.                   ENDM
  1018.  
  1019. ;———————————————————————————————————————————————————————————
  1020. ; Test and set exception.
  1021. ;———————————————————————————————————————————————————————————
  1022.                   MACRO
  1023.                   FTESTXCP
  1024.                   MOVE.W      #FOTESTXCP,-(SP)
  1025.                   _FP68K
  1026.                   ENDM
  1027.  
  1028.                   MACRO
  1029.                   FSETXCP
  1030.                   move.l      (sp),-(sp)
  1031.                   jsr         _fprocENTRYsp
  1032.                   MOVE.W      #FOSETXCP,-(SP)
  1033.                   _FP68K
  1034.                   clr.l       (sp)+
  1035.                   jsr         _fprocEXITsp
  1036.                   ENDM
  1037.  
  1038. ;———————————————————————————————————————————————————————————
  1039. ; Procedure entry and exit.
  1040. ;———————————————————————————————————————————————————————————
  1041.                   MACRO
  1042.                   FPROCENTRY
  1043.                   MOVE.W      #FOPROCENTRY,-(SP)
  1044.                   _FP68K
  1045.                   ENDM
  1046.  
  1047.                   MACRO
  1048.                   FPROCEXIT
  1049.                   move.l      (sp),-(sp)
  1050.                   jsr         _fprocENTRYsp
  1051.                   MOVE.W      #FOPROCEXIT,-(SP)
  1052.                   _FP68K
  1053.                   clr.l       (sp)+
  1054.                   jsr         _fprocEXITsp
  1055.                   ENDM
  1056.  
  1057. ;———————————————————————————————————————————————————————————
  1058. ; Get and set halt vector.
  1059. ;———————————————————————————————————————————————————————————
  1060.                   MACRO
  1061.                   FGETHV
  1062.                   MOVE.W      #FOGETHV,-(SP)
  1063.                   _FP68K
  1064.                   ENDM
  1065.  
  1066.                   MACRO
  1067.                   FSETHV
  1068.                   move.l      ([sp]),$0c0
  1069.                   move.l      ([sp]),$0c4
  1070.                   move.l      ([sp]),$0c8
  1071.                   move.l      ([sp]),$0cc
  1072.                   move.l      ([sp]),$0d0
  1073.                   move.l      ([sp]),$0d4
  1074.                   move.l      ([sp]),$0d8
  1075.                   MOVE.W      #FOSETHV,-(SP)
  1076.                   _FP68K
  1077.                   ENDM
  1078.  
  1079.  
  1080.  
  1081. ;———————————————————————————————————————————————————————————
  1082. ; Elementary function operation code masks.
  1083. ;———————————————————————————————————————————————————————————
  1084. FOLNX             EQU         $0000                     ; base-e log
  1085. FOLOG2X           EQU         $0002                     ; base-2 log
  1086. FOLN1X            EQU         $0004                     ; ln (1 + x)
  1087. FOLOG21X          EQU         $0006                     ; log2 (1 + x)
  1088.  
  1089. FOEXPX            EQU         $0008                     ; base-e exponential
  1090. FOEXP2X           EQU         $000A                     ; base-2 exponential
  1091. FOEXP1X           EQU         $000C                     ; exp (x) - 1
  1092. FOEXP21X          EQU         $000E                     ; exp2 (x) - 1
  1093.  
  1094. FOXPWRI           EQU         $8010                     ; integer exponentiation
  1095. FOXPWRY           EQU         $8012                     ; general exponentiation
  1096. FOCOMPOUND        EQU         $C014                     ; compound
  1097. FOANNUITY         EQU         $C016                     ; annuity
  1098.  
  1099. FOSINX            EQU         $0018                     ; sine
  1100. FOCOSX            EQU         $001A                     ; cosine
  1101. FOTANX            EQU         $001C                     ; tangent
  1102. FOATANX           EQU         $001E                     ; arctangent
  1103. FORANDX           EQU         $0020                     ; random
  1104.  
  1105. ;———————————————————————————————————————————————————————————
  1106. ; Elementary functions.
  1107. ;———————————————————————————————————————————————————————————
  1108.                   MACRO
  1109.                   FLNX                                  ; base-e log
  1110.                   flogn.x     ([sp]),fp0
  1111.                   fmove.x     fp0,([sp])
  1112.                   addq.l      #4,sp
  1113.                   ENDM
  1114.  
  1115.                   MACRO
  1116.                   FLOG2X                                ; base-2 log
  1117.                   flog2.x     ([sp]),fp0
  1118.                   fmove.x     fp0,([sp])
  1119.                   addq.l      #4,sp
  1120.                   ENDM
  1121.  
  1122.                   MACRO
  1123.                   FLN1X                                 ; ln (1 + x)
  1124.                   flognp1.x   ([sp]),fp0
  1125.                   fmove.x     fp0,([sp])
  1126.                   addq.l      #4,sp
  1127.                   ENDM
  1128.  
  1129.                   MACRO
  1130.                   FLOG21X                               ; log2 (1 + x)
  1131.                   move.l      (sp),-(sp)
  1132.                   jsr         _fprocENTRYsp
  1133.                   move.w      ([sp]),([sp],2)
  1134.                   addq.l      #2,(sp)
  1135.                   MOVE.W      #FOLOG21X,-(SP)
  1136.                   _ELEMS68K
  1137.                   move.w      ([sp],2),([sp])
  1138.                   clr.l       (sp)+
  1139.                   jsr         _fprocEXITsp
  1140.                   ENDM
  1141.  
  1142.                   MACRO
  1143.                   FEXPX                                 ; base-e exponential
  1144.                   fetox.x     ([sp]),fp0
  1145.                   fmove.x     fp0,([sp])
  1146.                   addq.l      #4,sp
  1147.                   ENDM
  1148.  
  1149.                   MACRO
  1150.                   FEXP2X                                ; base-2 exponential
  1151.                   ftwotox.x   ([sp]),fp0
  1152.                   fmove.x     fp0,([sp])
  1153.                   addq.l      #4,sp
  1154.                   ENDM
  1155.  
  1156.                   MACRO
  1157.                   FEXP1X                                ; exp (x) - 1
  1158.                   fetoxm1.x   ([sp]),fp0
  1159.                   fmove.x     fp0,([sp])
  1160.                   addq.l      #4,sp
  1161.                   ENDM
  1162.  
  1163.                   MACRO
  1164.                   FEXP21X                               ; exp2 (x) - 1
  1165.                   move.l      (sp),-(sp)
  1166.                   jsr         _fprocENTRYsp
  1167.                   move.w      ([sp]),([sp],2)
  1168.                   addq.l      #2,(sp)
  1169.                   MOVE.W      #FOEXP21X,-(SP)
  1170.                   _ELEMS68K
  1171.                   move.w      ([sp],2),([sp])
  1172.                   clr.l       (sp)+
  1173.                   jsr         _fprocEXITsp
  1174.                   ENDM
  1175.  
  1176.                   MACRO
  1177.                   FXPWRI                                ; integer exponential
  1178.                   jsr         _fprocENTRYsp
  1179.                   move.w      ([sp]),([sp],2)
  1180.                   addq.l      #2,(sp)
  1181.                   MOVE.W      #FOXPWRI,-(SP)
  1182.                   _ELEMS68K
  1183.                   move.w      ([12,sp],2),([12,sp])
  1184.                   jsr         _fprocEXITsp
  1185.                   ENDM
  1186.  
  1187.                   MACRO
  1188.                   FXPWRY                                ; general exponential
  1189.                   jsr         _fprocENTRYsp
  1190.                   move.w      ([4,sp]),([4,sp],2)
  1191.                   addq.l      #2,4(sp)
  1192.                   move.w      ([sp]),([sp],2)
  1193.                   addq.l      #2,(sp)
  1194.                   MOVE.W      #FOXPWRY,-(SP)
  1195.                   _ELEMS68K
  1196.                   move.w      ([12,sp],2),([12,sp])
  1197.                   jsr         _fprocEXITsp
  1198.                   ENDM
  1199.  
  1200.                   MACRO
  1201.                   FCOMPOUND                             ; compound
  1202.                   jsr         _fprocENTRYsp
  1203.                   move.l      12(sp),16(sp)
  1204.                   move.l      8(sp),12(sp)
  1205.                   move.l      28(sp),8(sp)
  1206.                   move.w      ([sp]),([sp],2)
  1207.                   addq.l      #2,(sp)
  1208.                   move.w      ([4,sp]),([4,sp],2)
  1209.                   addq.l      #2,4(sp)
  1210.                   move.w      ([8,sp]),([8,sp],2)
  1211.                   addq.l      #2,8(sp)
  1212.                   MOVE.W      #FOCOMPOUND,-(SP)
  1213.                   _ELEMS68K
  1214.                   move.w      ([8,sp],2),([8,sp])
  1215.                   jsr         _fprocEXITsp
  1216.                   ENDM
  1217.  
  1218.                   MACRO
  1219.                   FANNUITY                              ; annuity
  1220.                   jsr         _fprocENTRYsp
  1221.                   move.l      12(sp),16(sp)
  1222.                   move.l      8(sp),12(sp)
  1223.                   move.l      28(sp),8(sp)
  1224.                   move.w      ([sp]),([sp],2)
  1225.                   addq.l      #2,(sp)
  1226.                   move.w      ([4,sp]),([4,sp],2)
  1227.                   addq.l      #2,4(sp)
  1228.                   move.w      ([8,sp]),([8,sp],2)
  1229.                   addq.l      #2,8(sp)
  1230.                   MOVE.W      #FOANNUITY,-(SP)
  1231.                   _ELEMS68K
  1232.                   move.w      ([8,sp],2),([8,sp])
  1233.                   jsr         _fprocEXITsp
  1234.                   ENDM
  1235.  
  1236.                   MACRO
  1237.                   FSINX                                 ; sine
  1238.                   fsin.x      ([sp]),fp0
  1239.                   fmove.x     fp0,([sp])
  1240.                   addq.l      #4,sp
  1241.                   ENDM
  1242.  
  1243.                   MACRO
  1244.                   FCOSX                                 ; cosine
  1245.                   fcos.x      ([sp]),fp0
  1246.                   fmove.x     fp0,([sp])
  1247.                   addq.l      #4,sp
  1248.                   ENDM
  1249.  
  1250.                   MACRO
  1251.                   FTANX                                 ; tangent
  1252.                   ftan.x      ([sp]),fp0
  1253.                   fmove.x     fp0,([sp])
  1254.                   addq.l      #4,sp
  1255.                   ENDM
  1256.  
  1257.                   MACRO
  1258.                   FATANX                                ; arctangent
  1259.                   fatan.x     ([sp]),fp0
  1260.                   fmove.x     fp0,([sp])
  1261.                   addq.l      #4,sp
  1262.                   ENDM
  1263.  
  1264.                   MACRO
  1265.                   FRANDX                                ; random number generator
  1266.                   move.l      (sp),-(sp)
  1267.                   jsr         _fprocENTRYsp
  1268.                   move.w      ([sp]),([sp],2)
  1269.                   addq.l      #2,(sp)
  1270.                   MOVE.W      #FORANDX,-(SP)
  1271.                   _ELEMS68K
  1272.                   move.w      ([sp],2),([sp])
  1273.                   clr.l       (sp)+
  1274.                   jsr         _fprocEXITsp
  1275.                   ENDM
  1276.  
  1277. ;———————————————————————————————————————————————————————————
  1278. ; Scanner and formatter operation code masks
  1279. ;———————————————————————————————————————————————————————————
  1280.  
  1281. FOPSTR2DEC        EQU         $0002                     ;Pascal string to decimal record
  1282. FOCSTR2DEC        EQU         $0004                     ;C string to decimal record
  1283. FODEC2STR         EQU         $0003                     ;decimal record to Pascal string
  1284.  
  1285. ;———————————————————————————————————————————————————————————
  1286. ; Scanner and formatter functions
  1287. ;———————————————————————————————————————————————————————————
  1288.  
  1289. ;Pascal string to decimal record
  1290.  
  1291.                   MACRO
  1292.                   FPSTR2DEC
  1293.                   MOVE.W      #FOPSTR2DEC, -(SP)
  1294.                   _DecStr68K
  1295.                   ENDM
  1296.  
  1297. ;C string to decimal record
  1298.  
  1299.                   MACRO
  1300.                   FCSTR2DEC
  1301.                   MOVE.W      #FOCSTR2DEC, -(SP)
  1302.                   _DecStr68K
  1303.                   ENDM
  1304.  
  1305. ;decimal record to Pascal string
  1306.  
  1307.                   MACRO
  1308.                   FDEC2STR
  1309.                   MOVE.W      #FODEC2STR, -(SP)
  1310.                   _DecStr68K
  1311.                   ENDM
  1312.  
  1313.  
  1314.  
  1315. ;———————————————————————————————————————————————————————————
  1316. ; NaN codes.
  1317. ;———————————————————————————————————————————————————————————
  1318. NANSQRT           EQU         1                         ; Invalid square root such as sqrt(-1).
  1319. NANADD            EQU         2                         ; Invalid addition such as +INF - +INF.
  1320. NANDIV            EQU         4                         ; Invalid division such as 0/0.
  1321. NANMUL            EQU         8                         ; Invalid multiply such as 0 * INF.
  1322. NANREM            EQU         9                         ; Invalid remainder or mod such as x REM 0.
  1323. NANASCBIN         EQU         17                        ; Attempt to convert invalid ASCII string.
  1324. NANCOMP           EQU         20                        ; Result of converting comp NaN to floating.
  1325. NANZERO           EQU         21                        ; Attempt to create a NaN with a zero code.
  1326. NANTRIG           EQU         33                        ; Invalid argument to trig routine.
  1327. NANINVTRIG        EQU         34                        ; Invalid argument to inverse trig routine.
  1328. NANLOG            EQU         36                        ; Invalid argument to log routine.
  1329. NANPOWER          EQU         37                        ; Invalid argument to x^i or x^y routine.
  1330. NANFINAN          EQU         38                        ; Invalid argument to financial function.
  1331. NANINIT           EQU         255                       ; Uninitialized storage.
  1332.  
  1333. *
  1334. *                 _FC2X       converts a comp to a 96 bit extended
  1335.                                                         ;
  1336. *                 push        comp addr, then push destination addr, then jsr _FC2X .
  1337. *                 The         addresses are NOT popped for you, i.e. the call is C style.
  1338. *
  1339. *                 The         extended result is also left in fp0.
  1340. *
  1341. *                 All         data and address registers are preserved.
  1342. *
  1343. _FC2X             PROC
  1344.                   movem.l     d0-d1,-(sp)
  1345.                   movem.l     ([16,sp]),d0-d1
  1346.                   tst.l       d1
  1347.                   bgt.s       @1
  1348.                   beq.s       @3
  1349.                   addq.l      #1,d0
  1350. @1                fmove.l     d0,fp0
  1351.                   fscale.w    #32,fp0
  1352.                   fadd.l      d1,fp0
  1353.                   bvc.s       @2
  1354.                   fadd.s      #"$5f800000",fp0
  1355. @2                movem.l     (sp)+,d0-d1
  1356.                   fmove.x     fp0,([4,sp])
  1357.                   rts
  1358. @3                neg.l       d0
  1359.                   bvs.s       @4
  1360.                   neg.l       d0
  1361.                   bra.s       @1
  1362. @4                fmove.s     #"nan(20)",fp0
  1363.                   bra.s       @2
  1364.                   ENDPROC
  1365.  
  1366. ;———————————————————————————————————————————————————————————
  1367. ; Procentry Special Macro. (Stack-based environment; doesn't change rnd and prec.)
  1368. ;———————————————————————————————————————————————————————————
  1369.                   MACRO
  1370.                   FPROCENTRYSP
  1371.                   fmovem.l    fpcr/fpsr,-(sp)
  1372.                   clr.l       -(sp)
  1373.                   move.l      4(sp),-(sp)
  1374.                   and.l       #$ff,(sp)
  1375.                   fmovem.l    (sp)+,fpcr/fpsr
  1376.                   ENDM
  1377.  
  1378. *
  1379. *                 Subroutines _fprocENTRYsp and _fprocEXITsp bracket two argument SANE ROM calls,
  1380. *                 causing     their software exceptions to happen in hardware.
  1381. *
  1382. *                 ENTRY:      STACK: rtnaddr < DSTaddr < SRCaddr
  1383. *                 EXIT:       STACK: DSTaddr < SRCaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1384. *
  1385. *                 All         data and address registers are preserved.  FP1 is scratched.
  1386. *
  1387. _fprocENTRYsp     PROC
  1388.                   fmovem.l    (sp)+,fpiar
  1389.  
  1390.                   clr.l       -(sp)
  1391.                   fmovem      (sp),fp0
  1392.                   FPROCENTRYSP
  1393.                   fmovem      fp0,-(sp)
  1394.                   clr.l       (sp)+
  1395.  
  1396.                   fmovem.l    fpiar,-(sp)
  1397.                   rts
  1398.                   ENDPROC
  1399.  
  1400. *
  1401. *                 Subroutines _fprocEXITsp and _fprocENTRYsp bracket two argument SANE ROM calls,
  1402. *                 causing     their software exceptions to happen in hardware.
  1403. *
  1404. *                 ENTRY:      STACK: rtnaddr < FPCR < FPSR < (0).L < DSTaddr < SRCaddr
  1405. *                 EXIT:       STACK:
  1406. *
  1407. *                 All         data and address registers are preserved.  FP1 is scratched.
  1408. *
  1409. _fprocEXITsp      PROC
  1410.                   FMOVE.W     D1,FP1
  1411.                   FMOVE.L     FPSR,-(SP)
  1412.                   MOVE.W      2(SP),D1
  1413.                   CLR.L       (SP)+
  1414.                   FMOVEM.L    4(SP),FPCR/FPSR
  1415.  
  1416.                   OR.W        D1,10(SP)
  1417.                   AND.W       5(SP),D1                  ; Yes, 5
  1418.                   FMOVE.L     8(SP),FPSR
  1419.  
  1420.                   TST.B       D1
  1421.                   BEQ.S       @1
  1422.                   FNOP
  1423.                   NOP
  1424.                   FSAVE       -(SP)
  1425.                   CLR.W       D1
  1426.                   MOVE.B      1(SP),D1
  1427.                   BCLR        #3,(SP,D1.W)
  1428.                   FRESTORE    (SP)+
  1429.                   FNOP
  1430. @1                FMOVE.W     FP1,D1
  1431.                   MOVE.L      (SP),20(SP)
  1432.                   ADDA.W      #20,SP
  1433.                   RTS
  1434.                   ENDPROC
  1435.  
  1436.     ENDIF    ; ...already included